package la.iok.hzsvn.lewin.movie.controller;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.core.model.PlayRoleVo;
import la.iok.hzsvn.lewin.movie.model.PlayRoleParam;
import la.iok.hzsvn.lewin.movie.service.PlayRoleService;
import la.iok.hzsvn.share.response.ListDataResponse;
import la.iok.hzsvn.share.response.OperatorResponse;
import la.iok.hzsvn.share.response.OperatorResponses;
import la.iok.hzsvn.share.response.SingleDataResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("playRoles")
public class PlayRoleController {
    private final PlayRoleService playRoleService;

    public PlayRoleController(PlayRoleService playRoleService) {
        this.playRoleService = playRoleService;
    }

    /**
     * 保存角色信息
     * @param token 操作用户
     * @param id 剧本id
     * @param param 角色信息
     * @return 操作结果，包含保存角色的id
     */
    @PostMapping("movie/{id}")
    public SingleDataResponse<Long> save(@RequestHeader Token token, @PathVariable Long id, @RequestBody PlayRoleParam param){
        return new SingleDataResponse<>(playRoleService.save(token,id,param));
    }

    /**
     * 上传角色文件
     * @param token 操作用户
     * @param id 角色id
     * @param file 角色文件
     * @param path 角色文件在剧本中的存储路径，相对剧本根目录
     * @return 操作结果
     */
    @PostMapping("{id}/file")
    public OperatorResponse uploadFile(@RequestHeader Token token, @PathVariable Long id, MultipartFile file,String path){
        playRoleService.uploadFile(token,id,path,file);
        return OperatorResponses.success();
    }

    /**
     * 修改角色信息
     * @param token 操作用户
     * @param id 角色id
     * @param param 角色信息
     * @return 操作结果
     */
    @PutMapping("{id}")
    public OperatorResponse update(@RequestHeader Token token, @PathVariable Long id, @RequestBody PlayRoleParam param) {
        playRoleService.update(token,id,param);
        return OperatorResponses.success();
    }

    /**
     * 删除角色
     * @param token 操作用户
     * @param id 角色id
     * @return 操作结果
     */
    @DeleteMapping("{id}")
    public OperatorResponse delete(@RequestHeader Token token, @PathVariable Long id){
        playRoleService.delete(token,id);
        return OperatorResponses.success();
    }

    /**
     * 查询角色文件摘要信息
     * @param id 角色id
     * @return 角色文件摘要信息
     */
    @GetMapping("{id}/digest")
    public SingleDataResponse<String> digest(@PathVariable Long id){
        return OperatorResponses.stringSingleDataResponse(playRoleService.digest(id));
    }

    /**
     * 查询角色文件存储路径
     * @param id 角色id
     * @return 角色文件摘要信息
     */
    @GetMapping("{id}/storePath")
    public SingleDataResponse<String> storePath(@PathVariable Long id){
        return OperatorResponses.stringSingleDataResponse(playRoleService.storePath(id));
    }

    /**
     * 查询剧本的所有角色
     * @param token 操作用户
     * @param id 剧本id
     * @return 角色列表
     */
    @GetMapping("movie/{id}")
    public ListDataResponse<PlayRoleVo> roles(@RequestHeader Token token, @PathVariable Long id){
        return new ListDataResponse<>(playRoleService.movieRoles(token,id));
    }

    /**
     * 下载角色文件
     * @param token 操作用户
     * @param response 响应
     * @param id 角色id
     */
    @GetMapping("{id}/file")
    public void downloadFile(@RequestHeader Token token, HttpServletResponse response, @PathVariable Long id){
        playRoleService.downloadFile(token,response,id);
    }
}
